package org.labuladong.滑动窗口;

import java.util.HashSet;
import java.util.Set;

/**
 * @author Fql18
 * @Auther: qingle
 * @Date: 2024/10/24-22:56
 * @Description:
 *
这段代码使用两个指针left和right来表示子串的开始和结束位置。
同时使用一个HashSet来存储当前子串中的字符。
当right指针遍历到一个字符，如果这个字符已经在HashSet中，说明出现了重复，此时需要移动left指针，直到重复的字符被移出HashSet。
每次移动right指针时，都会尝试将当前字符加入HashSet，并更新最长子串的长度。
最终返回maxLen即为所求的最长子串长度。
 * @version: 1.0
 */
public class LCR_016_无重复字符的最长子串_AI {

	class Solution {
		public int lengthOfLongestSubstring(String s) {
			// 使用HashSet存储已经遍历过的字符
			Set<Character> set = new HashSet<>();
			int maxLen = 0; // 用于记录最长子串的长度
			int left = 0; // 左指针

			for (int right = 0; right < s.length(); right++) {
				// 当右指针遍历到的字符已经在HashSet中，说明出现了重复
				while (set.contains(s.charAt(right))) {
					// 移除左指针指向的字符，并移动左指针
					set.remove(s.charAt(left++));
				}
				// 将当前字符加入HashSet，并更新最长子串长度
				set.add(s.charAt(right));
				maxLen = Math.max(maxLen, right - left + 1);
			}

			return maxLen;
		}
	}

}
